# views.py: 路由，视图函数
# 蓝图
from flask import Blueprint,request,render_template
from sqlalchemy import desc,and_,or_,not_

from .models import *
blue = Blueprint('user',__name__)
# blue2 = Blueprint('product',__name__)
@blue.route('/')
def index1():
    return '<h1>index1</h1>'

# 表单操作
#   增删改查
# 增：添加数据
@blue.route('/useradd/')
def user_add():
    # 添加一条数据
    # u = User()
    # u.id = 1
    # u.name = '张三'
    # u.age = 20
    # db.session.add(u) # 将 u 对象添加到 session 中，相当于缓存
    # db.session.commit() #

    # 添加多条数据
    users = []
    for i in range(10,30):
        u = User()
        u.id = i
        u.name = '小张' + str(i)
        u.age = i
        users.append(u)
        try:
            db.session.add_all(users)
            db.session.commit() # 事务提交
        except Exception as e:
            db.session.rollback() # 回滚
            db.session.flush() # 刷新，清空缓存
            return 'fail' + str(e)
    return 'success!'

# 删：删除数据
# 找到要删除的数据，然后删除
@blue.route('/userdel/')
def user_del():
    # u = User.query.first() # 查询第一条数据
    # db.session.delete(u)  #  session.delete() 只能删单个已映射（mapped）对象，不能直接删 Query
    # db.session.commit()
    users = User.query.filter(User.age == 20).all()
    for u in users:
        db.session.delete(u)
    db.session.commit()

    return 'success!'

# 删：修改数据
# 找到要修改的数据，进行修改
@blue.route('/userupdate/')
def user_update():
    u = User.query.first() # 查询第一条数据
    u.age = 100
    db.session.commit()
    return 'success!'

@blue.route('/userselect/')
def user_select():
    # all()：返回所有数据，返回列表
    # users = User.query.all()
    # print(users,type(users)) # <class 'list'>
    # print(User.query,type(User.query)) # <class 'flask_sqlalchemy.query.Query'>

    # filter() :过滤 得到查询集，类似 sql 中的 where
    # users = User.query.filter()
    # print(users,type(users)) # 查询集
    # print(list(users))

    # get() :查询到对应主键的数据对象
    # user = User.query.get(8)
    # print(user,type(user)) # <class 'App.models.User'>
    # print(user.name,user.age,user.id)

    # filter():类似于SQL中的where
    # filter_by():用于等值操作的过滤
    # users = User.query.filter(User.age == 100)
    # users = User.query.filter(User.age < 100)
    # users = User.query.filter_by(age = 100)
    # print(user)
    # print(list(users))

    # first():第一条数据
    # first_or_404():第一条数据，如果不存在则抛出404异常
    # user = User.query.first()
    # user = User.query.filter_by(age=2).first_or_404()

    # count():统计查询集中的数据条数
    # users = User.query.filter()
    # print(users.count())

    # limit():取前几条记录
    # offset():跳过前几条记录
    # users = User.query.offset(3).limit(2)
    # print(list(users))

    # order_by():排序
    # users = User.query.order_by('age') # 默认升序，使用 asc 指定
    # users = User.query.order_by(desc('age')) # 用 desc 降序
    # print(list(users))

    # 逻辑运算：and_,or_,not_
    # users = User.query.filter(User.age > 20 ,User.age <= 100)  # 且
    # users = User.query.filter(and_(User.age > 20, User.age <= 100))
    # print(list(users))

    # 查询属性
    # contains('3'):模糊查找，类似SQL中的like
    # users = User.query.filter(User.name.contains('3'))
    # in_() :其中之一
    # users = User.query.filter(User.age.in_([10,20,30,40]))
    # print(list(users))

    # startswith() :以某子串开头
    # endswith() :以某子串结尾
    # users = User.query.filter(User.name.startswith('小'))
    # users = User.query.filter(User.name.endswith('2'))
    # print(list(users))

    #  __gt__ :大于
    users = User.query.filter(User.age.__gt__(20))
    print(list(users))

    return 'success!'

# 分页，翻页
# 1.手动翻页
#     offset().limit()
# 页码：page
# 每页显示数量：per_page=5
# page = n,  offset((page - 1)*per_page).limit(per_page)

# 2.paginate 对象
# @blue.route('/paginate/<page>/<per_page>/')
@blue.route('/paginate/')
def get_paginate():
    # 也页码：默认显示第一页
    page = int(request.args.get('page',1))
    # per_page: 每页显示数据量
    per_page = int(request.args.get('per_page',5))
    # print(page,type(page))
    # print(per_page,type(per_page))

    # paginate()
    p = User.query.paginate(page = page,per_page = per_page,error_out=False)
    # paginate对象的属性：
    # items：返回当前页的内容列表
    print(p.items)

    # has_next：是否还有下一页
    print(p.has_next)
    return render_template('paginate.html',p=p)


